package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"

	"gitee.com/go-course/grpc-demo/rpc/service"
)

// var
// var var1 int = "string"
// var _ Service = &HelloService{}
// int(60)  --> (int)(<type>)
// 我们声明了一个空指针, 强制把这个指针转换成了一个*HelloService
var _ service.Service = (*HelleServceClient)(nil)

// 客户端构造函数
func NewHelleServceClient(network, address string) (
	service.Service, error) {
	// 首先是通过rpc.Dial拨号RPC服务, 建立连接
	conn, err := net.Dial(network, address)
	if err != nil {
		return nil, err
	}

	// 客户端实现了基于 JSON的编解码
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))

	return &HelleServceClient{
		client: client,
	}, nil
}

type HelleServceClient struct {
	client *rpc.Client
}

// 对于RPC客户端来说，我们就需要包装客户端的调用
func (c *HelleServceClient) Hello(name string, resp *string) error {
	return c.client.Call(service.Name+".Hello", name, resp)
}

func main() {
	// 初始化客户端实例
	client, err := NewHelleServceClient("tcp", "127.0.0.1:1234")
	if err != nil {
		panic(err)
	}

	// 发起客户端调用
	var resp string
	client.Hello("bob", &resp)

	// 打印服务端返回的信息
	fmt.Println(resp)
}
